#include "Sistema.h"


Sistema::Sistema(){
	U=NULL;
	ProfReg=NULL;
}
Sistema::~Sistema(){
	delete U;
	delete ProfReg;
}

Universidad* Sistema::getU(){
	return U;
}

void Sistema::modificarDatosU(string direccion,int telefono){
	U->setDireccion(direccion);
	U->setTelefono(telefono);
}

void Sistema::agregarUniversidad(string nombre,string direccion,int telefono){
	U=new Universidad(nombre,direccion,telefono);
}

void Sistema::agregarDepartamento(string nombre){
	Departamento* dep1=new Departamento(nombre);	
	if(U->getDepartamentos()->listaVacia()){
		Nodo<Departamento>* n1=new Nodo<Departamento>(NULL,dep1);
		U->getDepartamentos()->setDummy(n1);
		U->getDepartamentos()->IncrementarLongitud();
	}
	else{
		Nodo<Departamento>* n1=new Nodo<Departamento>(NULL,dep1);
		n1->setNext(U->getDepartamentos()->getDummy());
		U->getDepartamentos()->setDummy(n1);
		U->getDepartamentos()->IncrementarLongitud();
	}
}

void Sistema::mostrarDepartamentos(){
	if(!(U->getDepartamentos()->listaVacia())){
		Nodo<Departamento>*aux1=U->getDepartamentos()->getDummy();
		cout<<"Mostrando Departamentos:..."<<endl;
		while(!aux1==NULL){
			cout<<"----------------------------------------------------------"<<endl;
			cout<<aux1->getInfo()->toString()<<" = "<<U->getNombre()<<endl;
			aux1=aux1->getNext();
		}
		cout<<"----------------------------------------------------------"<<endl;	
	}
	else{
		cout<<"No hay ningun Departamento Registrado...."<<endl;
	}
}

Departamento* Sistema::obtenerDepartamento(string nombre){
	Nodo<Departamento>* aux1=U->getDepartamentos()->getDummy();
	while(aux1!=NULL){
		if(aux1->getInfo()->getNombre()==nombre){
			return aux1->getInfo();
		}
		aux1=aux1->getNext();		
	}
		return NULL;
}

void Sistema::agregarCurso(string nombre, string siglas,int creditos,Departamento *dep){
	Curso* cru=new Curso(nombre,siglas,creditos);
	if(dep->getCursos()->listaVacia()){
		Nodo<Curso>* aux1=new Nodo<Curso>(NULL,cru);
		dep->getCursos()->setDummy(aux1);
		dep->getCursos()->IncrementarLongitud();
	}
	else{
		Nodo<Curso>* aux1=new Nodo<Curso>(NULL,cru);
		aux1->setNext(dep->getCursos()->getDummy());
		dep->getCursos()->setDummy(aux1);
		dep->getCursos()->IncrementarLongitud();
	}
}

void Sistema::mostrarCursos(Departamento *dep){
	if(!(dep->getCursos()->listaVacia())){
		cout<<"Mostrando cursos del Departamento: "<<dep->getNombre()<<endl;
		Nodo<Curso>* cur1=dep->getCursos()->getDummy();
		while(cur1!=NULL){
			cout<<"----------------------------------------------"<<endl;
			cout<<cur1->getInfo()->toString()<<endl;
			cur1=cur1->getNext();
		}
	}
	else{
		cout<<"El Departamento: "<<dep->getNombre()<<" - "<<"No tiene ningun curso registrado"<<endl;
	}
}

Curso*  Sistema::obtenerCurso(string sigla,Departamento* dep){
	Nodo<Curso>*n1=dep->getCursos()->getDummy();
	while(n1!=NULL){
		if(n1->getInfo()->getSigla()==sigla){
			return n1->getInfo();
		}
		n1=n1->getNext();
	}
	return NULL;
}

void Sistema::modificarDatosCurso(string nombre,Curso* T){
	T->setNombre(nombre);
}

void Sistema::eliminarCurso(Curso* T,Departamento* dep){
	Nodo<Curso>*n1=dep->getCursos()->getDummy();
	while(n1->getNext()->getInfo()->getSigla()!=T->getSigla()){
		n1=n1->getNext();
	}
	Nodo<Curso>*n2=n1->getNext();
	n1->setNext(n2->getNext());
	delete n2;
	dep->getCursos()->DisminuirLongitud();
}

Profesor* Sistema::obtenerProfesor(Departamento* T,string id){
	Nodo<Profesor>* aux1=T->getProfesores()->getDummy();
	while(aux1!=NULL){
		if(aux1->getInfo()->getCedula()==id){
			return aux1->getInfo();
		}		
		aux1=aux1->getNext();
	}
	return NULL;
}

void Sistema::agregarProfesor(string nombre,string ap1,string ap2,string id, Departamento* T){
	Profesor* aux1=new Profesor(nombre,ap1,ap2,id,T);
	if(T->getProfesores()->listaVacia()){
		Nodo<Profesor>* nodProf=new Nodo<Profesor>(NULL,aux1);
		T->getProfesores()->setDummy(nodProf);
		T->getProfesores()->IncrementarLongitud();
	}
	else{
		Nodo<Profesor>* nodProf=new Nodo<Profesor>(NULL,aux1);
		nodProf->setNext(T->getProfesores()->getDummy());
		T->getProfesores()->setDummy(nodProf);
		T->getProfesores()->IncrementarLongitud();
	}
}

void Sistema::modificarProfesor(string nombre,string ap1,string ap2, Profesor* T){
	T->setNombre(nombre);
	T->setApe1(ap1);
	T->setApe2(ap2);
}

void Sistema::mostrarProfesorCedula(Profesor* T){
	cout<<T->toString();
}

void Sistema::mostrarProfesorEscuela(Departamento* T){
	Nodo<Profesor>* no1=T->getProfesores()->getDummy();
	while(no1!=NULL){
		cout<<endl;
		cout<<no1->getInfo()->toString();
		cout<<"--------------------------------------------------"<<endl;
		cout<<endl;
		no1=no1->getNext();
	}
}

void Sistema::asignarCursoProf(Curso* cur,Profesor* prof){
	Nodo<Curso>* nodCur=new Nodo<Curso>(NULL,cur);
	if(prof->getLista()->listaVacia()){
		prof->getLista()->setDummy(nodCur);
		prof->getLista()->IncrementarLongitud();
	}
	else{
		nodCur->setNext(prof->getLista()->getDummy());
		prof->getLista()->setDummy(nodCur);
		prof->getLista()->IncrementarLongitud();
	}
}



void Sistema::consultaListaCursoDeProf(Profesor* T){
	Nodo<Curso>* nodCur=T->getLista()->getDummy();
	while(nodCur!=NULL){
		cout<<endl;
		cout<<nodCur->getInfo()->toString();
		cout<<"---------------------------------------------"<<endl;
		cout<<endl;
		nodCur=nodCur->getNext();
	}
}

void Sistema::agregarEstudiante(Estudiante* T){
	Nodo<Estudiante>* nodEst=new Nodo<Estudiante>(NULL,T);
	if(U->getEstudiantes()->listaVacia()){
		U->getEstudiantes()->setDummy(nodEst);
		U->getEstudiantes()->IncrementarLongitud();
	}
	else{
		nodEst->setNext(U->getEstudiantes()->getDummy());
		U->getEstudiantes()->setDummy(nodEst);
		U->getEstudiantes()->IncrementarLongitud();
	}
}

Estudiante* Sistema::obtenerEstudiante(string cedula){
	Nodo<Estudiante>* nodEst=U->getEstudiantes()->getDummy();
	while(nodEst!=NULL){
		if(nodEst->getInfo()->getCarnet()==cedula){
			return nodEst->getInfo();
		}
		
		nodEst=nodEst->getNext();
	}
	return NULL;
}